/*!
 * \file frxml_parse.h
 *
 * \brief xml解析
 *
 * All Rights Reserved Copyright (C) 2014 broada,Co.,Ltd.\n
 * 接口定向，实现xml的操作
 *
 * \version 2.0
 * \author geyh
 * \date 2015/03/20
 *
 */
 
#ifndef __FRXML_PARSE_H_
#define __FRXML_PARSE_H_

#include <libxml/xmlreader.h>

#include "frlist.h"

/*
 * \判断 xml协议
 *
 * \p_data_in
 * \i_data_len
 *
 * \return              FR_SUCC:    成功
 *                      FR_FAIL:    失败
 */
int frxml_isxml(char *p_data_in, int i_data_len);

/*
 * \获取 encoding
 *
 * \p_data_in
 * \i_data_len
 *
 * \pp_encoding
 *
 * \return              FR_SUCC:    成功
 *                      FR_FAIL:    失败
 */
int frxml_get_encoding(char *p_data_in, int i_data_len, char **pp_encoding);

/*!
 * 链表释放
 *
 * \param pp_list_header
 *
 */
void frxml_free_list(Frlist_header **pp_list_header);

/*!
 * 链表打印
 *
 * \param p_list_header
 *
 */
void frxml_dbg_list(Frlist_header *p_list_header);

/*!
 * 打开xml文件
 *
 * \param p_file_name 文件名
 *
 * \return p_st_doc
 *
 */
xmlDocPtr frxml_open_file(const char *p_file_name);

/*!
 * 保存xml文件
 *
 * \param p_st_doc
 * \param p_file_name 文件名
 *
 */
void frxml_save_file(xmlDocPtr p_st_doc, const char *p_file_name);

/*!
 * 关闭xml文件
 *
 * \param p_st_doc
 *
 */
void frxml_close_file(xmlDocPtr p_st_doc);


/*!
 * 从文档(指针)中获取字符串
 *
 * \param p_st_doc
 * \param p_keyword
 * \param p_prop_name
 * \param pp_value 输出内容
 *
 * \return FR_SUCC:成功\n
 *         FR_FAIL:失败
 *
 * \note 需要外部释放pp_value的内存
 *
 */
int frxml_get2ptr_prop_string(xmlDocPtr p_st_doc, const char *p_xpath, const char *p_keyword, const char *p_prop_name, char **pp_value);

/*!
 * 从文档中获取字符串
 *
 * \param p_file_name
 * \param p_xpath（节点路径）取第三级节点时(/root/node1/node2)
 * \param p_keyword
 * \param p_prop_name
 * \param pp_value 输出内容
 *
 * \return FR_SUCC:成功\n
 *         FR_FAIL:失败
 *
 * \note 需要外部释放pp_value的内存
 *
 */
int frxml_get2doc_prop_string(const char *p_file_name, const char *p_xpath, const char *p_keyword, const char *p_prop_name, char **pp_value);

/*!
 * 从文档(指针)中获取字符串
 *
 * \param p_st_doc
 * \param p_xpath（节点路径）取第三级节点时(/root/node1/node2)
 * \param p_keyword
 * \param pp_value 输出内容
 *
 * \return FR_SUCC:成功\n
 *         FR_FAIL:失败
 *
 * \note 需要外部释放pp_value的内存
 *
 */
int frxml_get2ptr_string(xmlDocPtr p_st_doc, const char *p_xpath, const char *p_keyword, char **pp_value);

/*!
 * 从文档(指针)中获取int
 *
 * \param p_st_doc
 * \param p_xpath（节点路径）取第三级节点时(/root/node1/node2)
 * \param p_keyword
 * \param p_i_value 输出整数
 *
 * \return FR_SUCC:成功\n
 *         FR_FAIL:失败
 *
 */
int frxml_get2ptr_int(xmlDocPtr p_st_doc, const char *p_xpath, const char *p_keyword, int *p_i_value);

/*!
 * 从文档(指针)中获取float
 *
 * \param p_st_doc
 * \param p_xpath（节点路径）取第三级节点时(/root/node1/node2)
 * \param p_keyword
 * \param p_i_value 输出float
 *
 * \return FR_SUCC:成功\n
 *         FR_FAIL:失败
 *
 */
int frxml_get2ptr_float(xmlDocPtr doc, const char *p_xpath, const char *p_keyword, float *p_f_value);

/*!
 * 判断文件中是否存在value
 *
 * \param p_file_name       (文件名)
 * \param p_xpath           (节点路径)取第三级节点时(/root/node1/node2)
 * \param p_keyword         标签名
 * \param p_value           内容
 * \param p_i_has           (1：存在   0：不存在)
 *
 * \return FR_SUCC:成功\n
 *         FR_FAIL:失败
 *
 */
int frxml_detect2doc_string(const char *p_file_name, const char *p_xpath, const char *p_keyword, char *p_value, int *p_i_has);

/*!
 * 从文档中获取字符串
 *
 * \param p_file_name(文件名)
 * \param p_xpath（节点路径）取第三级节点时(/root/node1/node2)
 * \param p_keyword 要寻找的目标标签
 * \param pp_value 如果输入不是UTF-8时，得到的转化后的数据(需要外部释放)
 *
 * \return FR_SUCC:成功\n
 *         FR_FAIL:失败
 *
 * \note 查询到第1个自动停止\n
 *       需要外部释放pp_value的内存
 *
 */
int frxml_get2doc_string(const char *p_file_name, const char *p_xpath, const char *p_keyword, char **pp_value);

/*!
 * 从文档中获取int
 *
 * \param p_file_name(文件名)
 * \param p_xpath（节点路径）取第三级节点时(/root/node1/node2)
 * \param p_keyword 要寻找的目标标签
 * \param p_i_value 获取的int
 *
 * \return FR_SUCC:成功\n
 *         FR_FAIL:失败
 *
 * \note 查询到第1个自动停止
 *
 */
int frxml_get2doc_int(const char *p_file_name, const char *p_xpath, const char *p_keyword, int *p_i_value);

/*!
 * 从文档中获取int
 *
 * \param p_file_name(文件名)
 * \param p_xpath（节点路径）取第三级节点时(/root/node1/node2)
 * \param p_keyword 要寻找的目标标签
 * \param p_f_value 获取的float
 *
 * \return FR_SUCC:成功\n
 *         FR_FAIL:失败
 *
 * \note 查询到第1个自动停止
 *
 */
int frxml_get2doc_float(const char *p_file_name, const char *p_xpath, const char *p_keyword, float *p_f_value);

/*!
 * 在指定节点下添加内容
 *
 * \param p_file_name
 * \param p_xpath（节点路径）取第三级节点时(/root/node1/node2)
 * \param p_keyword
 * \param p_value
 *
 * \return FR_SUCC:成功\n
 *         FR_FAIL:失败
 *
 */
int frxml_insert2doc_content(const char *p_file_name,const char *p_xpath, const char *p_keyword, const char *p_value);

/*!
 * 在指定节点下添加内容
 *
 * \param p_st_doc
 * \param p_xpath（节点路径）取第三级节点时(/root/node1/node2)
 * \param p_keyword
 * \param p_value
 *
 * \return FR_SUCC:成功\n
 *         FR_FAIL:失败
 *
 */
int frxml_insert2ptr_content(xmlDocPtr p_st_doc,const char *p_xpath, const char *p_keyword, const char *p_value);

/*!
 * 修改KEYWORD  如果不存在则添加
 *
 * \param p_file_name
 * \param p_xpath（节点路径）取第三级节点时(/root/node1/node2)
 * \param p_keyword
 * \param p_value
 *
 * \return FR_SUCC:成功\n
 *         FR_FAIL:失败
 *
 */
int frxml_update2doc_content(const char *p_file_name, const char *p_path, const char *p_keyword, const char *p_value);

/*!
 * 删除与指定节点名相同的所有节点
 *
 * \param p_file_name
 * \param p_xpath（节点路径）取第三级节点时(/root/node1/node2)
 * \param p_keyword
 *
 * \return FR_SUCC:成功\n
 *         FR_FAIL:失败
 *
 */
int frxml_del2doc_all_cont(const char *p_file_name, const char *p_path, const char *p_keyword);

/*!
 * 删除与节点名和内容相同的节点(1个)
 *
 * \param p_file_name
 * \param p_xpath（节点路径）取第三级节点时(/root/node1/node2)
 * \param p_keyword
 * \param p_value
 *
 * \return FR_SUCC:成功\n
 *         FR_FAIL:失败
 *
 */
int frxml_del2doc_one_cont(const char *p_file_name, const char *p_path, const char *p_keyword, const char *p_value);

/*!
 * 文件中取节点集(字符串)
 *
 * \param p_file_name      （文件名）
 * \param p_xpath（节点路径）取第三级节点时(/root/node1/node2)
 * \param p_keyword         节点名
 * \param pp_list_header    出力链表
 *
 * \return FR_SUCC:成功\n
 *         FR_FAIL:失败
 *
 * \note 需要外部用frxml_free_list释放pp_list_header
 *
 */
int frxml_get_string_list(const char *p_file_name,const char *p_path, const char *p_keyword, Frlist_header **pp_list_header);

/*!
 * 文件中取节点集(int)
 *
 * \param p_file_name      （文件名）
 * \param p_xpath（节点路径）取第三级节点时(/root/node1/node2)
 * \param p_keyword         节点名
 * \param pp_list_header    出力链表
 *
 * \return FR_SUCC:成功\n
 *         FR_FAIL:失败
 *
 * \note 需要外部用frxml_free_list释放pp_list_header
 *
 */
int frxml_get_int_list(const char *p_file_name,const char *p_path, const char *p_keyword, Frlist_header **pp_list_header);

/*!
 * 文件中取节点集(float)
 *
 * \param p_file_name      （文件名）
 * \param p_xpath（节点路径）取第三级节点时(/root/node1/node2)
 * \param p_keyword         节点名
 * \param pp_list_header    出力链表
 *
 * \return FR_SUCC:成功\n
 *         FR_FAIL:失败
 *
 * \note 需要外部用frxml_free_list释放pp_list_header
 *
 */
int frxml_get_float_list(const char *p_file_name,const char *p_path, const char *p_keyword, Frlist_header **pp_list_header);


#endif
